export class TrafficLight {
    constructor(options) {
        const {
            red = 60,
            green = 60,
            yellow = 3,
            initial = 'green',
        } = options || {};
        this._colors = {
            red: {
                seconds: red,
                next: 'yellow'
            },
            green: {
                seconds: green,
                next: 'yellow'
            },
            yellow: {
                seconds: yellow
            }
        }
        // 开始切换到初始颜色
        this._switch(initial);
    }

    _switch(color) {
        this._currentColor = color;
        this._seconds = this._colors[color].seconds;
        this._time = Date.now();
    }

    _next() {
        // 下一个灯如果不是黄色的的时候 就是红色或者绿色那它的下一个是确定的
        if (this._currentColor === 'red') {
            // 注意在已知当前灯是 红色 的时候就得注意确定并且设置黄灯的下一个是 绿灯
            this._colors.yellow.next = 'green'
        } else if (this._currentColor === 'green') {
            this._colors.yellow.next = 'red'
        }
        this._switch(this._colors[this._currentColor].next);
    }

    getCurrentLight() {
        // floor 会在跳到0的时候进行切换 ceil会在跳到1
        // 需要切换的剩余时间 = 当前灯的时间 - ( 当前时间 - 开始切换的起始时间 )
        const remain = Math.floor(this._seconds - (Date.now() - this._time) / 1000)

        // 如果 需要切换的剩余时间 小于0 说明当前时间已经超过此灯应该维持的时间了
        if (remain <= 0) {
            this._next()
            return this.getCurrentLight()
        }

        // 否则就是当前灯不变
        return {
            color: this._currentColor,
            remain: remain
        }
    }
}
